package org.gtesoreria

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.gtesoreria.utils.MenuOption;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
class ProveedorController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
	
	def importadorService
	
    def index = {
        redirect(action: "list", params: params)
    }

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
		flash.message = null
        [proveedorInstanceList: Proveedor.list(params), proveedorInstanceTotal: Proveedor.count(), 
			breadcrumbOptions:["Proveedores"],
			proveedorOptions:[
					new MenuOption(text:"Nuevo...", link:"/GTesoreria/proveedor/create"),
					new MenuOption(text:"Pagos", link:"/GTesoreria/proveedor/listDeudasView"),
				 	new MenuOption(text:"Subsidios", link:"/GTesoreria/proveedor/listSubsidiosView")]]
    }

    def create = {
        def proveedorInstance = new Proveedor()
        proveedorInstance.properties = params
        return [proveedorInstance: proveedorInstance,breadcrumbOptions:["Proveedores","Crear Proveedor"],
			proveedorOptions:[
					new MenuOption(text:"Nuevo...", link:"/GTesoreria/proveedor/create"),
					new MenuOption(text:"Pagos", link:"/GTesoreria/proveedor/listDeudasView"),
				 	new MenuOption(text:"Subsidios", link:"/GTesoreria/proveedor/listSubsidiosView")]]
    }

    def save = {
        def proveedorInstance = new Proveedor(params)
        if (proveedorInstance.save(flush: true)) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), proveedorInstance.id])}"
            redirect(action: "show", id: proveedorInstance.id)
        }
        else {
            render(view: "create", model: [proveedorInstance: proveedorInstance])
        }
    }

    def show = {
        def proveedorInstance = Proveedor.get(params.id)
        if (!proveedorInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), params.id])}"
            redirect(action: "list")
        }
        else {
			
			
           [proveedorInstance: proveedorInstance, 
			proveedorOptions:[new MenuOption(link:"/GTesoreria/proveedor/show/" + params.id,text:proveedorInstance.nombre),
				new MenuOption(link:"/GTesoreria/consumo/list?proveedorId=" + params.id,text:"Consumos")],
			breadcrumbOptions:["Proveedores", proveedorInstance.nombre]]
        }
    }

    def edit = {
        def proveedorInstance = Proveedor.get(params.id)
        if (!proveedorInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [proveedorInstance: proveedorInstance,
				proveedorOptions:[new MenuOption(link:"/GTesoreria/proveedor/show/" + params.id,text:proveedorInstance.nombre),
				new MenuOption(link:"/GTesoreria/consumo/list?proveedorId=" + params.id,text:"Consumos")],
			breadcrumbOptions:["Proveedores", proveedorInstance.nombre]]
        }
    }

    def update = {
        def proveedorInstance = Proveedor.get(params.id)
        if (proveedorInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (proveedorInstance.version > version) {
                    
                    proveedorInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'proveedor.label', default: 'Proveedor')] as Object[], "Another user has updated this Proveedor while you were editing")
                    render(view: "edit", model: [proveedorInstance: proveedorInstance])
                    return
                }
            }
            proveedorInstance.properties = params
            if (!proveedorInstance.hasErrors() && proveedorInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), proveedorInstance.id])}"
                redirect(action: "show", id: proveedorInstance.id)
            }
            else {
                render(view: "edit", model: [proveedorInstance: proveedorInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), params.id])}"
            redirect(action: "list")
        }
    }

    def delete = {
        def proveedorInstance = Proveedor.get(params.id)
        if (proveedorInstance) {
            try {
                proveedorInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'proveedor.label', default: 'Proveedor'), params.id])}"
            redirect(action: "list")
        }
    }
	
	def importarConsumos = {
		CommonsMultipartFile f = request.getFile('myFile')
		if(!f.empty) {
			def proveedor = Proveedor.get(params.idProveedor)
			Map<Integer, String> result = importadorService.importConsumos(params.mes, proveedor, f);
			
			if(!result.isEmpty()) {
				flash.message = result.values().each { v -> println v + "<br/>"}
			}else {
				flash.message = "Importacion de consumos exitosa!!!"
			}
			
			redirect(action: "show", id:params.idProveedor)
		}
		else {
		   flash.message = 'Archivo no puede ser vacio'
		   redirect(action: "list")
		}
	}
	
	def searchableService
	def consumoService
	
	def importarConsumosByName = {
		try{
			Configuracion conf = consumoService.getConfiguracion()
			def porcSubsidio = params.porcSubsidio
			porcSubsidio = Integer.parseInt(porcSubsidio)
			if(porcSubsidio > 0 && porcSubsidio < 100){
				conf.porcSubsidio = porcSubsidio
				conf.save()
			} else {
				def mensaje = 'El Porcentaje de subsidio contiene un valor invalido'
				render(view: "importacion", model:[mensaje:mensaje, porcSubsidio:consumoService.getPorcSubsidio()])
				return
			}
		}catch(Exception exc ) {
			def mensaje = 'El Porcentaje de subsidio contiene un valor invalido'
			render(view: "importacion", model:[mensaje:mensaje, porcSubsidio:consumoService.getPorcSubsidio()])
			return
		}
		CommonsMultipartFile f = request.getFile('myFile')
		if(!f.empty) {
			
			String fileName = f.getOriginalFilename().replace(".XLS","").replace(".xls","");
			def values = fileName.split("-");
			if(values.size() != 3){
				def mensaje = 'Nombre de Archivo no valido. Debe ser {NOMBRE_PROVEEDOR}-{MES}-{ANIO}.xls'
				render(view: "importacion", model:[mensaje:mensaje, porcSubsidio:consumoService.getPorcSubsidio()])
				return
			}
				
			String proveedorName = values[0];
			String mes = values[1]
			String anio = values[2]
			if(validFileName(proveedorName, mes, anio)){
				def c = Proveedor.createCriteria()
				def resultado = c.list { ilike('nombre', "%"+ proveedorName +"%") }
				def proveedor = resultado.first();
				
				if(params.isFarmacia.equals("on") && !proveedor.rubro.codigo.equals(Rubro.rubroFarmacia.codigo)){
					def mensaje = 'El proveedor '+ proveedor.nombre +'no es una farmacia.'
					render(view: "importacion", model:[mensaje:mensaje, porcSubsidio:consumoService.getPorcSubsidio()])
					return
				}
				
				def mesInt = 1 + ConsultaAfiliadosController.MESES.findIndexOf { it == mes.toUpperCase() }
				Map<Integer, String> result =null;
				if(!params.isFarmacia.equals("on") && !proveedor.rubro.codigo.equals(Rubro.rubroFarmacia.codigo)){
				 	result = importadorService.importConsumos(mesInt + "/" + anio, proveedor, f);
				} else {
					result = importadorService.importConsumosFarmacia(mesInt + "/" + anio, proveedor, f);
				}
				def mensaje
				def total = 0
				def consumosImportados = null
				if(!result.get("consumosImportados")) {
					mensaje = result.values().each { v -> println v + "<br/>"}
				}else {
					flash.message = "Importacion de consumos exitosa!!!<br/> Se importaron consumos de "+ mesInt + "/" + anio +" de " + proveedor.nombre
					DateFormat formatter = new SimpleDateFormat("MM/yyyy")
					def fecha = formatter.parse(mesInt + "/" + anio)
					consumosImportados = result.get("consumosImportados")
					total = consumoService.getSubTotal(consumosImportados)
				}
				render(view: "importacion", model:[mensaje:mensaje,consumosImportados:consumosImportados, total:total, consumoOptions:[new MenuOption(link:"/GTesoreria/proveedor/importacion",text:"Importar Consumos"),
						new MenuOption(link:"/GTesoreria/consumo/listPorPeriodoView",text:"Consumos por periodo")],
						porcSubsidio:consumoService.getPorcSubsidio()])
				
			} else {
				def mensaje = 'Nombre de Archivo no valido. Debe ser {NOMBRE_PROVEEDOR}-{MES}-{ANIO}.xls'
				render(view: "importacion", model:[mensaje:mensaje, porcSubsidio:consumoService.getPorcSubsidio()])
				return	
			}
		}
		else {
		   def mensaje = 'Archivo no puede ser vacio'
		   render(view: "importacion", model:[mensaje:mensaje, porcSubsidio:consumoService.getPorcSubsidio()])
		}
	}
	
	def importacion = {
		flash.message = 'Recuerde que el nombre del archivo debe ser "NOMBRE PROVEEDOR-MES-A&Ntilde;IO.xls" <br/>(Ej.:Almacen El Destino-Marzo-2011.xls)'
		
		render(view:"importacion", model:[breadcrumbOptions:["Consumos","Importar consumos"], 
				consumoOptions:[new MenuOption(link:"/GTesoreria/proveedor/importacion",text:"Importar Consumos"),
					new MenuOption(link:"/GTesoreria/consumo/listPorPeriodoView",text:"Consumos por periodo")],
				porcSubsidio:consumoService.getPorcSubsidio()])
	}
	
	boolean validFileName(String pro, String mes, String anio){
		try{
			def c = Proveedor.createCriteria()
			def resultado = c.list { ilike('nombre', "%"+ pro +"%") }
			if(resultado && !resultado.isEmpty() && resultado.size() > 0){
				
			} else
				return false
			if(ConsultaAfiliadosController.MESES.contains(mes.toUpperCase())){
				
			} else
				return false
			
			def a =Integer.parseInt(anio)
			
			if(a > 1980 && a < 2050) {
			
			} else
				return false
			return true
		} catch(Exception nex){
			return false
		}
    }
	
	def listDeudasView = {
		render(view:"listDeudas",model:[breadcrumbOptions:["Proveedores","Pagos"],
			proveedorOptions:[new MenuOption(text:"Pagos", link:"/GTesoreria/proveedor/listDeudasView"),
				new MenuOption(text:"Subsidios", link:"/GTesoreria/proveedor/listSubsidiosView")]])
	}
	
	def listDeudas = {
		Date from = null
		Date to = null
		SimpleDateFormat formatoDeFecha = new SimpleDateFormat("MM/yyyy");
		if(params.from instanceof String && params.to instanceof String){
			from = formatoDeFecha.parse(params.from)
			to = formatoDeFecha.parse(params.to)
		}else{
			from = params.from
			to = params.to
		}
		
		
		if(params.from > params.to) {
			flash.message="Fechas Invalidas"
			render(view:"listDeudas",model:[])
			return;
		}

		def proveedor = null
		def consumos = null
		if(params.proveedor && params.proveedor != "null"){
			proveedor = Proveedor.get(params.proveedor)
			consumos = consumoService.consumosEnProveedorEntreFechas(proveedor, from, to, params.sort,params.order);
		} else {
			consumos = consumoService.consumosBetweenDates(from, to, params.sort,params.order)
		}
		def total = consumoService.getSubTotal(consumos)
		def totalProveedor = consumoService.getSubTotalProveedor(consumos)
		render(view:"listDeudas",model:[consumoInstanceList:consumos,
										total:total,
										totalProveedor:totalProveedor,
										breadcrumbOptions:["Proveedores","Pagos"],
										proveedorOptions:[new MenuOption(text:"Pagos", link:"/GTesoreria/proveedor/listDeudasView"),
											new MenuOption(text:"Subsidios", link:"/GTesoreria/proveedor/listSubsidiosView")],
										from:formatoDeFecha.format(from),
										to:formatoDeFecha.format(to),
										proveedor:proveedor?.id
										])
	}
	
	def listSubsidiosView = {
		render(view:"listSubsidios",model:[breadcrumbOptions:["Proveedores","Pagos","Subsidios"],
			proveedorOptions:[new MenuOption(text:"Pagos", link:"/GTesoreria/proveedor/listDeudasView"),
				new MenuOption(text:"Subsidios", link:"/GTesoreria/proveedor/listSubsidiosView")]])
	}
	
	def listSubsidios = {
		
		Date from = null
		Date to = null
		SimpleDateFormat formatoDeFecha = new SimpleDateFormat("MM/yyyy");
		if(params.from instanceof String && params.to instanceof String){
			from = formatoDeFecha.parse(params.from)
			to = formatoDeFecha.parse(params.to)
		}else{
			from = params.from
			to = params.to
		}
		
		
		if(params.from > params.to) {
			flash.message="Fechas Invalidas"
			render(view:"listSubsidios",model:[])
			return;
		}
		
		
		def proveedor = null
		def consumos = null
		if(params.proveedor && params.proveedor != "null"){
			proveedor = Proveedor.get(params.proveedor)
			if(proveedor.rubro.codigo == Rubro.rubroFarmacia.codigo)
				consumos = consumoService.subsidiosEnProveedorEntreFechas(proveedor, from, to, params.sort,params.order);
			else
				consumos = Collections.emptyList();
		} else {
			consumos = consumoService.subsidiosEntreFechas(from, to, params.sort,params.order)
		}
		def total = consumoService.getSubTotal(consumos)
		def totalProveedor = consumoService.getSubTotalProveedor(consumos)
		def totalSubsidios = consumoService.getSubTotalSubsidio(consumos)
		render(view:"listSubsidios",model:[consumoInstanceList:consumos,
										total:total,
										totalProveedor:totalProveedor,
										totalSubsidios:totalSubsidios,
										breadcrumbOptions:["Proveedores","Pagos","Subsidios"],
										proveedorOptions:[new MenuOption(text:"Pagos", link:"/GTesoreria/proveedor/listDeudasView"),
											new MenuOption(text:"Subsidios", link:"/GTesoreria/proveedor/listSubsidiosView")],
										from:formatoDeFecha.format(from),
										to:formatoDeFecha.format(to),
										proveedor:proveedor?.id
										])
	}
}
